Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


meshchatx/src/frontend/js/rnode/Diagnostics.js 9f71f3420c18d5800afb493b723c328d23c7ea12 (9f71f342) Text, 8.24 KB

Tff7b72import Te6edf3RNodeUtils Tff7b72from Ta5d6ff"./RNodeUtils.js"Tb4b4b4;

T8b949e/**
* Smart diagnostics for connected RNode devices.
*
* Given an open RNode handle, inspect()/inspectQuiet() will try to read the
* essential identification & state from the device and return a structured
* report including i18n suggestion keys for any issues detected.
*
* The suggestion keys map directly to entries under
* tools.rnode_flasher.diagnostics.* in the locale files, so the UI does not
* need any logic to translate raw issue identifiers.
*/

Tff7b72export Tff7b72const Te6edf3ISSUE_NOT_PROVISIONED Tff7b72= Ta5d6ff"not_provisioned"Tb4b4b4;
Tff7b72export Tff7b72const Te6edf3ISSUE_FIRMWARE_HASH_MISSING Tff7b72= Ta5d6ff"firmware_hash_missing"Tb4b4b4;
Tff7b72export Tff7b72const Te6edf3ISSUE_FIRMWARE_HASH_MISMATCH Tff7b72= Ta5d6ff"firmware_hash_mismatch"Tb4b4b4;
Tff7b72export Tff7b72const Te6edf3ISSUE_PRODUCT_MISMATCH Tff7b72= Ta5d6ff"product_mismatch"Tb4b4b4;
Tff7b72export Tff7b72const Te6edf3ISSUE_NO_FIRMWARE_VERSION Tff7b72= Ta5d6ff"no_firmware_version"Tb4b4b4;
Tff7b72export Tff7b72const Te6edf3ISSUE_DETECT_FAILED Tff7b72= Ta5d6ff"detect_failed"Tb4b4b4;
Tff7b72export Tff7b72const Te6edf3ISSUE_READ_TIMEOUT Tff7b72= Ta5d6ff"read_timeout"Tb4b4b4;

Tff7b72const Te6edf3ALL_ISSUE_KEYS Tff7b72= Tff7b72new Tffa657SetTb4b4b4(Tb4b4b4[
Te6edf3ISSUE_NOT_PROVISIONEDTb4b4b4,
Te6edf3ISSUE_FIRMWARE_HASH_MISSINGTb4b4b4,
Te6edf3ISSUE_FIRMWARE_HASH_MISMATCHTb4b4b4,
Te6edf3ISSUE_PRODUCT_MISMATCHTb4b4b4,
Te6edf3ISSUE_NO_FIRMWARE_VERSIONTb4b4b4,
Te6edf3ISSUE_DETECT_FAILEDTb4b4b4,
Te6edf3ISSUE_READ_TIMEOUTTb4b4b4,
Tb4b4b4]Tb4b4b4)Tb4b4b4;

Tff7b72function Te6edf3suggestionKeysForTb4b4b4(Te6edf3issueTb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4[Ta5d6ff`Ta5d6fftools.rnode_flasher.diagnostics.suggestions.Tffd700${Te6edf3issueTffd700}Ta5d6ff`Tb4b4b4]Tb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3withTimeoutTb4b4b4(Te6edf3promiseTb4b4b4, Te6edf3msTb4b4b4, Te6edf3codeTb4b4b4) Tb4b4b4{
Tff7b72let Te6edf3timer Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72const Te6edf3timeoutPromise Tff7b72= Tff7b72new Tffa657PromiseTb4b4b4(Tb4b4b4(Te6edf3_Tb4b4b4, Te6edf3rejectTb4b4b4) Tb4b4b4=> Tb4b4b4{
Te6edf3timer Tff7b72= Te6edf3setTimeoutTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3err Tff7b72= Tff7b72new Tf85149ErrorTb4b4b4(Te6edf3code Tff7b72|| Ta5d6ff"timeout"Tb4b4b4)Tb4b4b4;
Te6edf3errTb4b4b4.Te6edf3code Tff7b72= Te6edf3code Tff7b72|| Ta5d6ff"TIMEOUT"Tb4b4b4;
Te6edf3rejectTb4b4b4(Te6edf3errTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4, Te6edf3msTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72return Tffa657PromiseTb4b4b4.Te6edf3raceTb4b4b4(Tb4b4b4[Te6edf3promiseTb4b4b4, Te6edf3timeoutPromiseTb4b4b4]Tb4b4b4)Tb4b4b4.Tff7b72finallyTb4b4b4(Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3timerTb4b4b4) Tb4b4b4{
Te6edf3clearTimeoutTb4b4b4(Te6edf3timerTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72function Te6edf3safeArrayEqualTb4b4b4(Te6edf3aTb4b4b4, Te6edf3bTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Te6edf3aTb4b4b4) Tff7b72|| Tff7b72!Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Te6edf3bTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3aTb4b4b4.Te6edf3length Tff7b72!== Te6edf3bTb4b4b4.Te6edf3lengthTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3aTb4b4b4.Te6edf3lengthTb4b4b4; Te6edf3iTff7b72++Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3aTb4b4b4[Te6edf3iTb4b4b4] Tff7b72& T79c0ff0xffTb4b4b4) Tff7b72!== Tb4b4b4(Te6edf3bTb4b4b4[Te6edf3iTb4b4b4] Tff7b72& T79c0ff0xffTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Tff7b72trueTb4b4b4;
Tb4b4b4}

T8b949e/**
* Run a diagnostics sweep against a connected RNode.
*
* @param {object} rnode RNode instance (already detected/open)
* @param {{ expectedProductId?: number, expectedModelId?: number, timeoutMs?: number }} [options]
* @returns {Promise<{
* firmwareVersion: string|null,
* platform: number|null,
* board: number|null,
* mcu: number|null,
* eepromBytes: number[]|null,
* romDetails: object|null,
* firmwareHash: number[]|null,
* targetFirmwareHash: number[]|null,
* isProvisioned: boolean,
* issues: string[],
* suggestionKeys: string[],
* summary: object,
* }>}
*/
Tff7b72export Tff7b72async Tff7b72function Te6edf3diagnoseTb4b4b4(Te6edf3rnodeTb4b4b4, Te6edf3options Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3timeoutMs Tff7b72= Te6edf3optionsTb4b4b4.Te6edf3timeoutMs Tff7b72|| T79c0ff4000Tb4b4b4;
Tff7b72const Te6edf3result Tff7b72= Tb4b4b4{
Te6edf3firmwareVersionTff7b72: Tff7b72nullTb4b4b4,
Te6edf3platformTff7b72: Tff7b72nullTb4b4b4,
Te6edf3boardTff7b72: Tff7b72nullTb4b4b4,
Te6edf3mcuTff7b72: Tff7b72nullTb4b4b4,
Te6edf3eepromBytesTff7b72: Tff7b72nullTb4b4b4,
Te6edf3romDetailsTff7b72: Tff7b72nullTb4b4b4,
Te6edf3firmwareHashTff7b72: Tff7b72nullTb4b4b4,
Te6edf3targetFirmwareHashTff7b72: Tff7b72nullTb4b4b4,
Te6edf3isProvisionedTff7b72: Tff7b72falseTb4b4b4,
Te6edf3issuesTff7b72: Tb4b4b4[Tb4b4b4]Tb4b4b4,
Te6edf3suggestionKeysTff7b72: Tb4b4b4[Tb4b4b4]Tb4b4b4,
Te6edf3summaryTff7b72: Tb4b4b4{Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4;

Tff7b72const Te6edf3addIssue Tff7b72= Tb4b4b4(Te6edf3issueTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3ALL_ISSUE_KEYSTb4b4b4.Te6edf3hasTb4b4b4(Te6edf3issueTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72returnTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3resultTb4b4b4.Te6edf3issuesTb4b4b4.Te6edf3includesTb4b4b4(Te6edf3issueTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3issuesTb4b4b4.Te6edf3pushTb4b4b4(Te6edf3issueTb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3key Tff7b72of Te6edf3suggestionKeysForTb4b4b4(Te6edf3issueTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3resultTb4b4b4.Te6edf3suggestionKeysTb4b4b4.Te6edf3includesTb4b4b4(Te6edf3keyTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3suggestionKeysTb4b4b4.Te6edf3pushTb4b4b4(Te6edf3keyTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}Tb4b4b4;

Tff7b72if Tb4b4b4(Tff7b72!Te6edf3rnode Tff7b72|| Tff7b72typeof Te6edf3rnodeTb4b4b4.Te6edf3getFirmwareVersion Tff7b72!== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Te6edf3addIssueTb4b4b4(Te6edf3ISSUE_DETECT_FAILEDTb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3resultTb4b4b4;
Tb4b4b4}

Tff7b72try Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3firmwareVersion Tff7b72= Tff7b72await Te6edf3withTimeoutTb4b4b4(Te6edf3rnodeTb4b4b4.Te6edf3getFirmwareVersionTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3timeoutMsTb4b4b4, Ta5d6ff"READ_TIMEOUT"Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3errTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3errTff7b72?Tb4b4b4.Te6edf3code Tff7b72=== Ta5d6ff"READ_TIMEOUT"Tb4b4b4) Tb4b4b4{
Te6edf3addIssueTb4b4b4(Te6edf3ISSUE_READ_TIMEOUTTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3addIssueTb4b4b4(Te6edf3ISSUE_NO_FIRMWARE_VERSIONTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3rnodeTb4b4b4.Te6edf3getPlatform Tff7b72=== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3platform Tff7b72= Tff7b72await Te6edf3withTimeoutTb4b4b4(Te6edf3rnodeTb4b4b4.Te6edf3getPlatformTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3timeoutMsTb4b4b4, Ta5d6ff"READ_TIMEOUT"Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// platform isn't critical for diagnostics
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3rnodeTb4b4b4.Te6edf3getBoard Tff7b72=== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3board Tff7b72= Tff7b72await Te6edf3withTimeoutTb4b4b4(Te6edf3rnodeTb4b4b4.Te6edf3getBoardTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3timeoutMsTb4b4b4, Ta5d6ff"READ_TIMEOUT"Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// ignore
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3rnodeTb4b4b4.Te6edf3getMcu Tff7b72=== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3mcu Tff7b72= Tff7b72await Te6edf3withTimeoutTb4b4b4(Te6edf3rnodeTb4b4b4.Te6edf3getMcuTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3timeoutMsTb4b4b4, Ta5d6ff"READ_TIMEOUT"Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// ignore
Tb4b4b4}
Tb4b4b4}

Tff7b72let Te6edf3romDetails Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3rnodeTb4b4b4.Te6edf3getRomAsObject Tff7b72=== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3rom Tff7b72= Tff7b72await Te6edf3withTimeoutTb4b4b4(Te6edf3rnodeTb4b4b4.Te6edf3getRomAsObjectTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3timeoutMsTb4b4b4, Ta5d6ff"READ_TIMEOUT"Tb4b4b4)Tb4b4b4;
Te6edf3resultTb4b4b4.Te6edf3eepromBytes Tff7b72= Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Te6edf3romTff7b72?Tb4b4b4.Te6edf3eepromTb4b4b4) Tff7b72? Tffa657ArrayTb4b4b4.Tff7b72fromTb4b4b4(Te6edf3romTb4b4b4.Te6edf3eepromTb4b4b4) Tff7b72: Tff7b72nullTb4b4b4;
Tff7b72try Tb4b4b4{
Te6edf3romDetails Tff7b72= Tff7b72typeof Te6edf3romTff7b72?Tb4b4b4.Te6edf3parse Tff7b72=== Ta5d6ff"function" Tff7b72? Te6edf3romTb4b4b4.Te6edf3parseTb4b4b4(Tb4b4b4) Tff7b72: Tff7b72nullTb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
Te6edf3romDetails Tff7b72= Tff7b72nullTb4b4b4;
Tb4b4b4}
Te6edf3resultTb4b4b4.Te6edf3romDetails Tff7b72= Te6edf3romDetailsTb4b4b4;
Te6edf3resultTb4b4b4.Te6edf3isProvisioned Tff7b72= Tffa657BooleanTb4b4b4(Te6edf3romDetailsTff7b72?Tb4b4b4.Te6edf3is_provisionedTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// ignore: handled by isProvisioned=false / not_provisioned issue below
Tb4b4b4}
Tb4b4b4}

Tff7b72if Tb4b4b4(Tff7b72!Te6edf3resultTb4b4b4.Te6edf3isProvisionedTb4b4b4) Tb4b4b4{
Te6edf3addIssueTb4b4b4(Te6edf3ISSUE_NOT_PROVISIONEDTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72if Tb4b4b4(
Te6edf3resultTb4b4b4.Te6edf3isProvisioned Tff7b72&&
Te6edf3optionsTb4b4b4.Te6edf3expectedProductId Tff7b72!== Tff7b72undefined Tff7b72&&
Te6edf3romDetails Tff7b72&&
Te6edf3romDetailsTb4b4b4.Te6edf3product Tff7b72!== Te6edf3optionsTb4b4b4.Te6edf3expectedProductId
Tb4b4b4) Tb4b4b4{
Te6edf3addIssueTb4b4b4(Te6edf3ISSUE_PRODUCT_MISMATCHTb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3rnodeTb4b4b4.Te6edf3getFirmwareHash Tff7b72=== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3firmwareHash Tff7b72= Tff7b72await Te6edf3withTimeoutTb4b4b4(Te6edf3rnodeTb4b4b4.Te6edf3getFirmwareHashTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3timeoutMsTb4b4b4, Ta5d6ff"READ_TIMEOUT"Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// ignore: hash retrieval can fail on un-provisioned units
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3rnodeTb4b4b4.Te6edf3getTargetFirmwareHash Tff7b72=== Ta5d6ff"function"Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3targetFirmwareHash Tff7b72= Tff7b72await Te6edf3withTimeoutTb4b4b4(Te6edf3rnodeTb4b4b4.Te6edf3getTargetFirmwareHashTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3timeoutMsTb4b4b4, Ta5d6ff"READ_TIMEOUT"Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
T8b949e// ignore
Tb4b4b4}
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3resultTb4b4b4.Te6edf3isProvisionedTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(
Tff7b72!Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3targetFirmwareHashTb4b4b4) Tff7b72||
Te6edf3resultTb4b4b4.Te6edf3targetFirmwareHashTb4b4b4.Te6edf3length Tff7b72=== T79c0ff0 Tff7b72||
Te6edf3resultTb4b4b4.Te6edf3targetFirmwareHashTb4b4b4.Te6edf3everyTb4b4b4(Tb4b4b4(Te6edf3bTb4b4b4) Tb4b4b4=> Tb4b4b4(Te6edf3b Tff7b72& T79c0ff0xffTb4b4b4) Tff7b72=== T79c0ff0Tb4b4b4)
Tb4b4b4) Tb4b4b4{
Te6edf3addIssueTb4b4b4(Te6edf3ISSUE_FIRMWARE_HASH_MISSINGTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(
Tffa657ArrayTb4b4b4.Te6edf3isArrayTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3firmwareHashTb4b4b4) Tff7b72&&
Te6edf3resultTb4b4b4.Te6edf3firmwareHashTb4b4b4.Te6edf3length Tff7b72> T79c0ff0 Tff7b72&&
Tff7b72!Te6edf3safeArrayEqualTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3firmwareHashTb4b4b4, Te6edf3resultTb4b4b4.Te6edf3targetFirmwareHashTb4b4b4)
Tb4b4b4) Tb4b4b4{
Te6edf3addIssueTb4b4b4(Te6edf3ISSUE_FIRMWARE_HASH_MISMATCHTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Te6edf3resultTb4b4b4.Te6edf3summary Tff7b72= Tb4b4b4{
Te6edf3firmware_versionTff7b72: Te6edf3resultTb4b4b4.Te6edf3firmwareVersionTb4b4b4,
Te6edf3platformTff7b72: Te6edf3resultTb4b4b4.Te6edf3platformTb4b4b4,
Te6edf3boardTff7b72: Te6edf3resultTb4b4b4.Te6edf3boardTb4b4b4,
Te6edf3mcuTff7b72: Te6edf3resultTb4b4b4.Te6edf3mcuTb4b4b4,
Te6edf3is_provisionedTff7b72: Te6edf3resultTb4b4b4.Te6edf3isProvisionedTb4b4b4,
Te6edf3productTff7b72: Te6edf3romDetailsTff7b72?Tb4b4b4.Te6edf3product Tff7b72?? Tff7b72nullTb4b4b4,
Te6edf3modelTff7b72: Te6edf3romDetailsTff7b72?Tb4b4b4.Te6edf3model Tff7b72?? Tff7b72nullTb4b4b4,
Te6edf3hardware_revisionTff7b72: Te6edf3romDetailsTff7b72?Tb4b4b4.Te6edf3hardware_revision Tff7b72?? Tff7b72nullTb4b4b4,
Te6edf3serial_numberTff7b72: Te6edf3romDetailsTff7b72?Tb4b4b4.Te6edf3serial_number Tff7b72?? Tff7b72nullTb4b4b4,
Te6edf3firmware_hashTff7b72: Te6edf3resultTb4b4b4.Te6edf3firmwareHash Tff7b72? Te6edf3RNodeUtilsTb4b4b4.Te6edf3bytesToHexTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3firmwareHashTb4b4b4) Tff7b72: Tff7b72nullTb4b4b4,
Te6edf3target_firmware_hashTff7b72: Te6edf3resultTb4b4b4.Te6edf3targetFirmwareHash Tff7b72? Te6edf3RNodeUtilsTb4b4b4.Te6edf3bytesToHexTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3targetFirmwareHashTb4b4b4) Tff7b72: Tff7b72nullTb4b4b4,
Tb4b4b4}Tb4b4b4;

Tff7b72return Te6edf3resultTb4b4b4;
Tb4b4b4}

T8b949e/**
* Compare a model id from products.js against the EEPROM to see whether the
* selected product/model in the UI matches the device the user just plugged
* in. Useful as a guardrail before flashing.
*/
Tff7b72export Tff7b72function Te6edf3evaluateProductMatchTb4b4b4(Te6edf3romDetailsTb4b4b4, Te6edf3expectedTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3romDetails Tff7b72|| Tff7b72!Te6edf3expectedTb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{ Te6edf3matchesTff7b72: Tff7b72falseTb4b4b4, Te6edf3reasonTff7b72: Ta5d6ff"missing_data" Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3romDetailsTb4b4b4.Te6edf3is_provisionedTb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{ Te6edf3matchesTff7b72: Tff7b72falseTb4b4b4, Te6edf3reasonTff7b72: Ta5d6ff"not_provisioned" Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3expectedTb4b4b4.Te6edf3productId Tff7b72!== Tff7b72undefined Tff7b72&& Te6edf3romDetailsTb4b4b4.Te6edf3product Tff7b72!== Te6edf3expectedTb4b4b4.Te6edf3productIdTb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{ Te6edf3matchesTff7b72: Tff7b72falseTb4b4b4, Te6edf3reasonTff7b72: Ta5d6ff"product_mismatch" Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3expectedTb4b4b4.Te6edf3modelId Tff7b72!== Tff7b72undefined Tff7b72&& Te6edf3romDetailsTb4b4b4.Te6edf3model Tff7b72!== Te6edf3expectedTb4b4b4.Te6edf3modelIdTb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{ Te6edf3matchesTff7b72: Tff7b72falseTb4b4b4, Te6edf3reasonTff7b72: Ta5d6ff"model_mismatch" Tb4b4b4}Tb4b4b4;
Tb4b4b4}
Tff7b72return Tb4b4b4{ Te6edf3matchesTff7b72: Tff7b72trueTb4b4b4, Te6edf3reasonTff7b72: Tff7b72null Tb4b4b4}Tb4b4b4;
Tb4b4b4}

Tff7b72export Tff7b72default Tb4b4b4{ Te6edf3diagnoseTb4b4b4, Te6edf3evaluateProductMatch Tb4b4b4}Tb4b4b4;


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────